/***************************************************
 @Name :        1196kk0
 @Time :        2025-05-26
 @Email :       2232506563@qq.com
 @Comment :     执行命令函数及OLED显示
 @FileName :    drv_ASRPRO.c
 @Version :     4.0
****************************************************/

#include "drv_ASRPRO.h"
#include "bmp.h"

/********* 全局变量 *********/
char USART2_Recv_Buff[255] = {0};       //串口接收字符串
uint8_t USART2_Recv_Index = 0;          //字符串下标
uint8_t Current_Sta = 0;                //实时状态标志
uint8_t Current_Exp = 0;                //实时表情标志

/***************************************
函数名：clear_USART2_Recv_Buff
函数功能：清空串口2接收缓存
输入参数：无
输出参数：无
其它：
****************************************/
void clear_USART2_Recv_Buff(void)
{
    memset(USART2_Recv_Buff , 0 , sizeof(USART2_Recv_Buff));
    USART2_Recv_Index = 0;
}

/***************************************
函数名：Execute_Cmd
函数功能：根据状态标志位执行命令
输入参数：无
输出参数：无
其它：
****************************************/
void Execute_Cmd(void)
{
    switch (Current_Sta)
    {
    case IDLE:
        Dog_Stand();
        break;
    case LED_Open:
        GPIO_ResetBits(GPIOF , GPIO_Pin_8);  
        break;
    case LED_CLose:
        GPIO_SetBits(GPIOF , GPIO_Pin_8);
        break;
    case DOG_Stand:
        Dog_Stand();
        break;
    case DOG_Sit:
        Dog_Sit();
        break;
    case DOG_Move_forward:
        Dog_Move_forward();
        break;      
    case DOG_Move_back:
        Dog_Move_back();
        break;
    case DOG_Turn_left:
        Dog_Turn_left();
        break;
    case DOG_Turn_right:
        Dog_Turn_right();
        break;
    case DOG_Dance:
        Dog_Dance();
        break;
    case DOG_Lie_down:
        Dog_Lie_down();
        break;
    case DOG_Handshake:
        Dog_Handshake();
        break;
    case DOG_Push_up:
        Dog_Push_up();
        break;
    case Fan_Open:
        GPIO_SetBits(GPIOC , GPIO_Pin_6);
        break;
    case Fan_Close:
        GPIO_ResetBits(GPIOC , GPIO_Pin_6);
        break;
    }
}

/********* 全局变量 *********/
extern SHT20_val tem_hum_data;

/***************************************
函数名：OLED_Show_Temp_Hum
函数功能：OLED显示实时温湿度
输入参数：无
输出参数：无
其它：
****************************************/
void OLED_Show_Temp_Hum(void)
{
    char temp_str[32] , hum_str[32];
    sprintf(temp_str , ":%.2fC" , tem_hum_data.tem);
    sprintf(hum_str , ":%.2f%%" , tem_hum_data.hum);
    OLED_Clear();
    OLED_ShowChinese(0 , 0 , 3 , 16 , 1);           //温
    OLED_ShowChinese(16 , 0 , 5 , 16 , 1);          //度
    OLED_ShowString(32 , 0 , temp_str , 16 , 1);
    OLED_ShowChinese(0 , 32 , 4 , 16 , 1);          //湿
    OLED_ShowChinese(16 , 32 , 5 , 16 , 1);         //度
    OLED_ShowString(32 , 32 , hum_str , 16 , 1);
}

/********* 全局变量 *********/
extern RTC_DateTypeDef RTC_DateStr;
extern RTC_TimeTypeDef RTC_TimeStr;

/***************************************
函数名：OLED_Show_Time
函数功能：OLED显示日期和时间
输入参数：无
输出参数：无
其它：
****************************************/
void OLED_Show_Time(void)
{
    u8 week;
    uint8_t date_buf[64] ,  time_buf[64];
    switch (RTC_DateStr.RTC_WeekDay)
    {
    case 1:
        week = 8;
        break;
    case 2:
        week = 9;
        break;
    case 3:
        week = 10;
        break;
    case 4:
        week = 11;
        break;
    case 5:
        week = 12;
        break;
    case 6:
        week = 13;
        break;
    case 7:
        week = 14;
        break;
    }
    sprintf(date_buf , "20%02d-%02d-%02d\n" , RTC_DateStr.RTC_Year , RTC_DateStr.RTC_Month , RTC_DateStr.RTC_Date);
    sprintf(time_buf , "%02d:%02d:%02d" , RTC_TimeStr.RTC_Hours , RTC_TimeStr.RTC_Minutes , RTC_TimeStr.RTC_Seconds);
    OLED_Clear();
    OLED_ShowString(0 , 0  , date_buf , 16 , 1);
    OLED_ShowChinese(0 , 20 , 6 , 16 , 1);
    OLED_ShowChinese(16 , 20 , 7 , 16 , 1);
    OLED_ShowChinese(32 , 20 , week , 16 , 1);
    OLED_ShowString(0 , 40 , time_buf , 16 , 1);
}

/***************************************
函数名：OLED_Show
函数功能：OLED显示表情
输入参数：无
输出参数：无
其它：
        Laugh          BMP5
        Work_hard      BMP6
        Cry            BMP4
        Shy            BMP3
        Afraid         BMP2
        Smile          BMP1
****************************************/
void OLED_Show(void)
{
    switch (Current_Exp)
    {
    case Laugh:
        OLED_ShowPicture(0,0,128,64,BMP5,1);
	    OLED_Refresh();
        break;
    case Work_hard:
        OLED_ShowPicture(0,0,128,64,BMP6,1);
	    OLED_Refresh();
        break;
    case Cry:
        OLED_ShowPicture(0,0,128,64,BMP4,1);
	    OLED_Refresh();
        break;
    case Shy:
        OLED_ShowPicture(0,0,128,64,BMP3,1);
	    OLED_Refresh();
        break;
    case Afraid:
        OLED_ShowPicture(0,0,128,64,BMP2,1);
	    OLED_Refresh();
        break;
    case Smile:
        OLED_ShowPicture(0,0,128,64,BMP1,1);
	    OLED_Refresh();
        break;
    case Temp_Hum_Data:
        OLED_Show_Temp_Hum();
	    OLED_Refresh();
        break;
    case Time:
        OLED_Show_Time();
        OLED_Refresh();
        break;
    }
}




